home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / tetujin / src / g_eff / digsm.c next >
Text File  |  1994-11-16  |  5KB  |  295 lines

  1. /*
  2.         graphic effect lib.
  3.           Video Digitize Smoother
  4.  
  5.         h. Toda 1994 4 23
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <egb.h>
  11. #include "g_eff.h"
  12.  
  13. #define NOERR 0        /* no error */
  14.  
  15. static int mx ;
  16. static int aSen ;
  17. static int mSen ;
  18. static int cMax ;
  19. static int aMax ;
  20. static int x1 ;
  21. static int y1 ;
  22. static int x2 ;
  23. static int y2 ;
  24. static int (*read1)() ;
  25. static int (*write)() ;
  26. static int (*mask)() ;
  27.  
  28. g_videoDigitizeSmoother( BASICPARA *para, int mode, int line )
  29. {
  30.     mx = para->mix ;
  31.     aSen = para->alphaSen ;
  32.     mSen = para->maskSen ;
  33.     cMax = para->colorMax ;
  34.     aMax = para->alphaMax ;
  35.     x1 = para->lupx ;
  36.     y1 = para->lupy ;
  37.     x2 = para->rdwx ;
  38.     y2 = para->rdwy ;
  39.     read1 = para->read1 ;
  40.     write = para->write ;
  41.     mask = para->mask ;
  42.  
  43.     line = ( line & 1 ) ^ 1 ;
  44.  
  45.     switch( mode )
  46.     {
  47.     case 0:
  48.         normal( line ) ;
  49.         break ;
  50.     case 1:
  51.         deep( line ) ;
  52.         break ;
  53.     default:
  54.         normal( line ) ;
  55.         break ;
  56.     }
  57.  
  58.     return NOERR ;
  59. }
  60.  
  61. static normal( int line )
  62. {
  63.     unsigned char a[4][4] ;
  64.     int i, x, y ;
  65.     int n ;
  66.  
  67.     for( y = y1 ; y <= y2 ; y++ )
  68.     {
  69.         if( (y % 2) == line )
  70.         {
  71.             for( x=x1 ; x <= x2 ; x++ )
  72.             {
  73.                 if( y >= 1 )
  74.                     read1( x, y-1, a[0] ) ;
  75.                 else
  76.                     read1( x, 1, a[0] ) ;
  77.                 read1( x, y,   a[1] ) ;
  78.                 read1( x, y+1, a[2] ) ;
  79.  
  80.                 for( i=0 ; i<3 ; i++ )
  81.                 {
  82.                     n = ck3( a[0][i], a[1][i], a[2][i] ) ;
  83.                     a[3][i] = a[n][i] ;
  84.                 }
  85.                 mixWrite( x, y, a[3], a[1] ) ;
  86.             }
  87.         }
  88.         else
  89.         {
  90.             for( x=x1 ; x <= x2 ; x++ )
  91.             {
  92.                 read1( x, y, a[1] ) ;
  93.                 mixWrite( x, y, a[1], a[1] ) ;
  94.             }
  95.         }
  96.     }
  97.  
  98.     return NOERR ;
  99. }
  100.  
  101. static deep( int line )
  102. {
  103.     unsigned char a[8][4] ;
  104.     int i, x, y ;
  105.     int n ;
  106.  
  107.     for( y = y1 ; y <= y2 ; y++ )
  108.     {
  109.         if( (y % 2) == line )
  110.         {
  111.             for( x=x1 ; x <= x2 ; x++ )
  112.             {
  113.                 if( y >= 1 )
  114.                 {
  115.                     read1( x-1, y-1, a[0] ) ;
  116.                     read1( x,   y-1, a[1] ) ;
  117.                     read1( x+1, y-1, a[2] ) ;
  118.                 }
  119.                 else
  120.                 {
  121.                     read1( x-1, 1, a[0] ) ;
  122.                     read1( x,   1, a[1] ) ;
  123.                     read1( x+1, 1, a[2] ) ;
  124.                 }
  125.                 read1( x,   y,   a[3] ) ;
  126.                 read1( x-1, y+1, a[4] ) ;
  127.                 read1( x,   y+1, a[5] ) ;
  128.                 read1( x+1, y+1, a[6] ) ;
  129.  
  130.                 for( i=0 ; i<3 ; i++ )
  131.                 {
  132.                     n = ck7( a[0][i], a[1][i], a[2][i],
  133.                              a[3][i], a[4][i], a[5][i], a[6][i] ) ;
  134.  
  135.                     a[7][i] = a[n][i] ;
  136.                 }
  137.                 mixWrite( x, y, a[7], a[3] ) ;
  138.             }
  139.         }
  140.         else
  141.         {
  142.             for( x=x1 ; x <= x2 ; x++ )
  143.             {
  144.                 read1( x, y, a[3] ) ;
  145.                 mixWrite( x, y, a[3], a[3] ) ;
  146.             }
  147.         }
  148.     }
  149.  
  150.     return NOERR ;
  151. }
  152.  
  153. /* 書き込むデータ a[4]   書き込まれる所にあるデータ b[4] */
  154.  
  155. static mixWrite( int x, int y, unsigned char *a, unsigned char *b )
  156. {
  157.     unsigned char c[4] ;
  158.     int mix ;
  159.  
  160.     if( mSen )
  161.     {
  162.         if( mask( x, y ) >= mSen )
  163.             return NOERR ;
  164.     }
  165.  
  166.     mix = mx ;
  167.     if( aSen )
  168.     {
  169.         mix = mix * b[3] / aMax ;
  170.     }
  171.  
  172.     c[0] = ( a[0] * mix + b[0] * ( 256 - mix ) + 0x80 ) >> 8 ;
  173.     c[1] = ( a[1] * mix + b[1] * ( 256 - mix ) + 0x80 ) >> 8 ;
  174.     c[2] = ( a[2] * mix + b[2] * ( 256 - mix ) + 0x80 ) >> 8 ;
  175.     c[3] = b[3] ;
  176.  
  177.     if( mix )
  178.     {
  179.         write( x, y, c ) ;
  180.     }
  181.  
  182.     return NOERR ;
  183. }
  184.  
  185. static ck3( int a, int b, int c )
  186. {
  187.     int temp ;
  188.     int n0, n1, n2 ;
  189.  
  190.     n0 = 0 ; n1 = 1 ; n2 = 2 ;
  191.  
  192.     if( a > b )
  193.     {
  194.         temp = a ;
  195.         a = b ;
  196.         b = temp ;
  197.  
  198.         temp = n0 ;
  199.         n0 = n1 ;
  200.         n1 = temp ;
  201.     }
  202.  
  203.     if( a > c )
  204.     {
  205.         temp = a ;
  206.         a = c ;
  207.         c = temp ;
  208.  
  209.         temp = n0 ;
  210.         n0 = n2 ;
  211.         n2 = temp ;
  212.     }
  213.  
  214.     if( b > c )
  215.     {
  216.         temp = b ;
  217.         b = c ;
  218.         c = temp ;
  219.  
  220.         temp = n1 ;
  221.         n1 = n2 ;
  222.         n2 = temp ;
  223.     }
  224.  
  225.     return n1 ;
  226. }
  227.  
  228. static ck7( int a0, int a1, int a2, int a3, int a4, int a5, int a6 )
  229. {
  230.     int temp ;
  231.     int m[7] ;
  232.     int a[7] ;
  233.     int i, j ;
  234.  
  235.     for( i=0 ; i<7 ; i++ )m[i] = i ;
  236.  
  237.     a[0] = a0 ; a[1] = a1 ; a[2] = a2 ; a[3] = a3 ;
  238.     a[4] = a4 ; a[5] = a5 ; a[6] = a6 ;
  239.  
  240.     for( j=1 ; j<5 ; j++ )
  241.     {
  242.         for( i=j ; i<7 ; i++ )
  243.         {
  244.             if( a[j-1] > a[i] )
  245.             {
  246.                 temp = a[i] ;
  247.                 a[i] = a[j-1] ;
  248.                 a[j-1] =temp ;
  249.  
  250.                 temp = m[i] ;
  251.                 m[i] = m[j-1] ;
  252.                 m[j-1] =temp ;
  253.             }
  254.         }
  255.     }
  256.  
  257.     return m[3] ;
  258. }
  259.  
  260. /*
  261. static ck9( int a0, int a1, int a2, int a3,
  262.             int a4, int a5, int a6, int a7, int a8 )
  263. {
  264.     int temp ;
  265.     int m[9] ;
  266.     int a[9] ;
  267.     int i, j ;
  268.  
  269.     for( i=0 ; i<9 ; i++ )m[i] = i ;
  270.  
  271.     a[0] = a0 ; a[1] = a1 ; a[2] = a2 ; a[3] = a3 ; a[4] = a4 ;
  272.     a[5] = a5 ; a[6] = a6 ; a[7] = a7 ; a[8] = a8 ;
  273.  
  274.     for( j=1 ; j<6 ; j++ )
  275.     {
  276.         for( i=j ; i<9 ; i++ )
  277.         {
  278.             if( a[j-1] > a[i] )
  279.             {
  280.                 temp = a[i] ;
  281.                 a[i] = a[j-1] ;
  282.                 a[j-1] =temp ;
  283.  
  284.                 temp = m[i] ;
  285.                 m[i] = m[j-1] ;
  286.                 m[j-1] =temp ;
  287.             }
  288.         }
  289.     }
  290.  
  291.     return m[4] ;
  292. }
  293. */
  294.  
  295.